565. 数组嵌套

565. 数组嵌套

Similar Question

Solution Tips

方案一: 有向图成环

遍历数组,从 i 向 nums[i] 连边,我们可以得到一张有向图。

由于题目保证 nums 中不含有重复的元素,因此有向图中每个点的出度和入度均为 1。

在这种情况下,有向图必然由一个或多个环组成。我们可以遍历 nums,找到节点个数最大的环。

代码实现时需要用一个 vis 数组来标记访问过的节点。

var arrayNesting = function(nums) {
    let ans = 0, n = nums.length;
    const vis = new Array(n).fill(0);
    for (let i = 0; i < n; ++i) {
        let cnt = 0;
        while (!vis[i]) {
            vis[i] = true;
            i = nums[i];
            ++cnt;
        }
        ans = Math.max(ans, cnt);
    }
    return ans;
};

方案二: 原地算法优化方案一

利用

nums 中的元素大小在 [0,n−1] 之间这一条件,我们可以省略 vis 数组,改为标记 nums[i]=n,来实现和

vis 数组同样的功能。

把数字放回自己正确的位置, 相当于是 442 的 swap 方案

class Solution:
    def arrayNesting(self, nums: List[int]) -> int:
        ans, n = 0, len(nums)
        for i in range(n):
            cnt = 0
            while nums[i] < n:
                num = nums[i]
                nums[i] = n
                i = num
                cnt += 1
            ans = max(ans, cnt)
        return ans